﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using vudu.Presentacion.Contrato.VU_07_Gestionar_Esquema_de_Evaluacion_por_Profesor;
using vudu.ClasesDominio;
using vudu.Logica.Fachada;
using System.Web.UI.WebControls;
using System.Data;

namespace vudu.Presentacion.Presentador.VU_07_Gestionar_Esquema_de_Evaluacion_por_Profesor
{
    public class PresentadorModificarEsquemaEvaluacion
    {
        private IContratoModificarEsquemaEvaluacion _vista;
        private EnlaceLogico _fachada;
        Evaluacion _evaluacionAModificar = new Evaluacion();

        //Constructor de la clase
        public PresentadorModificarEsquemaEvaluacion(IContratoModificarEsquemaEvaluacion vista, EnlaceLogico fachada)
        {
            _vista = vista;
            _fachada = fachada;
        }

        //Inicia la pantalla principal
        public void IniciarPantalla()
        {
            _vista.Esquemas.Visible = false;

            _vista.Primero.Visible = true;
            _vista.Segundo.Visible = false;
            _vista.Tercero.Visible = false;

            _vista.Obligatorio1.Visible = true;
            _vista.Obligatorio2.Visible = true;
            _vista.Obligatorio3.Visible = true;
            _vista.Obligatorio4.Visible = true;
            _vista.Materia.Visible = false;

            _vista.MensajeC.Visible = false;

        }

        //Inicia la pantalla secuandaria
        public void IniciarPantallaSecundaria()
        {
            _vista.Esquemas.Visible = true;

            _vista.Primero.Visible = true;
            _vista.Segundo.Visible = true;

            _vista.MensajeB.Visible = false;
            _vista.MensajeC.Visible = false;

        }

        //Llena el combobox de las secciones donde el profesor da clase y que no tengan notas relacionadas
        //a el esquema de evaluacion
        public void LlenarListaMateriasProfesor(Profesor profesor)
        {
            _vista.dMaterias.Items.Add(new ListItem("--Seleccione Materia--", "0"));

            List<SeccionMateria> materias = _fachada.ConsultarEsquemasDeEvaluacionSinNotasProfesor(profesor);

            for (int i = 0; i < materias.Count; i++)
            {

                _vista.dMaterias.Items.Add(new ListItem(materias[i].Materia.Nombre.ToString() + " Seccion: " + materias[i].Codigo.ToString(), materias[i].IdSeccionMateria.ToString()));

            }

            _vista.Informacion.Text = "Profesor(a): " + profesor.Nombre + " " + profesor.Apellido;
        }

        //LLena la tabla con la informacion actual del esquema de evaluacion
        public void LlenarTablaEsquema(SeccionMateria miSeccion)
        {
            _vista.Materia.Text = _vista.dMaterias.SelectedItem.Text;
            _vista.Materia.Visible = true;
            DataTable table = new DataTable();
            table.Columns.Add("Nombre", typeof(String));
            table.Columns.Add("Tipo", typeof(String));
            table.Columns.Add("Porcentaje", typeof(Int32));
            table.Columns.Add("Fecha", typeof(DateTime));
            foreach (Evaluacion _eval in _fachada.ConsultarEvaluacionPorSeccion(miSeccion))
            {
                table.Rows.Add(_eval.Nombre, _eval.TipoEvaluacion, _eval.Porcentaje, _eval.FechaEvaluacion);
            }
            _vista.Esquemas.Visible = true;
            _vista.Esquemas.DataSource = table;
            _vista.Esquemas.DataBind();
        }

        //Vacia la tabla de Esquema de Evaluacion
        public void VaciarTablaEsquema()
        {
            _vista.Esquemas.Visible = false;
        }

        //Carga el formulario con los datos actuales para que así el usuario los sobreescriba
        public void LlenarFormulario(SeccionMateria miSeccion)
        {

            _vista.Segundo.Visible = false;
            _vista.Tercero.Visible= true;
            _vista.MensajeC.Visible = false;

            List<Evaluacion> evaluaciones = _fachada.ConsultarEvaluacionPorSeccion(miSeccion);
            int seleccion = (_vista.Esquemas.PageIndex * 8) + _vista.Esquemas.SelectedIndex;
                    _vista.Nombre.Text = evaluaciones[seleccion].Nombre.ToString();
                    _vista.Porcentaje.Text = evaluaciones[seleccion].Porcentaje.ToString();
                    _vista.Fecha.Text = evaluaciones[seleccion].FechaEvaluacion.ToShortDateString();
                    _vista.Tipo.ClearSelection();
                    foreach (ListItem Tipo in _vista.Tipo.Items)
                    {
                        if (Tipo.Text == evaluaciones[seleccion].TipoEvaluacion.ToString())
                        {
                            Tipo.Selected = true;
                        }
                    }

                
            }

        //Cierra la ventana del formulario
        public void CerrarFormulario()
        {
            _vista.Segundo.Visible = true;
            _vista.Tercero.Visible = false;
        }

        //Realiza la modificacion de la informacion de la evaluacion en el esquema de la BD
        public void ModificarEvaluacion(SeccionMateria miSeccion)
        {
            if (ValidarDatos())
            {
                List<Evaluacion> evaluaciones = _fachada.ConsultarEvaluacionPorSeccion(miSeccion);
                int seleccion = (_vista.Esquemas.PageIndex * 8) + _vista.Esquemas.SelectedIndex;

                _evaluacionAModificar.IdEvaluacion = evaluaciones[seleccion].IdEvaluacion;

                if ((VerificarNombres(_evaluacionAModificar, evaluaciones)) && (VerificarPorcentajes(_evaluacionAModificar, evaluaciones)))
                {

                    if (_fachada.ModificarEvaluacion(_evaluacionAModificar))
                    {
                        _vista.Segundo.Visible = true;
                        _vista.Tercero.Visible = false;
                        LlenarTablaEsquema(miSeccion);
                        _vista.MensajeB.Text = "Operacion Exitosa: Se modifico la Evaluacion exitosamente";
                        _vista.MensajeB.ForeColor = System.Drawing.Color.Green;
                        _vista.MensajeB.Visible = true;
                    }
                    else
                    {
                        _vista.MensajeC.Text = "Operacion Fallida: Ocurrio un error no se pudo modificar la Evaluacion";
                        _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                        _vista.MensajeC.Visible = true;
                    }

                    
                }
            }
        }

        //Verifica que no existan nombres repetidos de las evaluciones en el esquema
        public bool VerificarNombres(Evaluacion miEval, List<Evaluacion> misEvaluaciones)
        {
            string nombre = miEval.Nombre;
            nombre = nombre.ToUpper();
            bool resultado = true;

            foreach (Evaluacion _eval in misEvaluaciones)
            {
                if ((nombre == _eval.Nombre.ToUpper()) && (miEval.IdEvaluacion != _eval.IdEvaluacion))
                {
                    _vista.MensajeC.Text = "Operacion Fallida: No puede cambiar la evaluacion a este nombre, no puede tener dos evaluaciones con el mismo nombre";
                    _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                    _vista.MensajeC.Visible = true;
                    _vista.NombreEval.ForeColor = System.Drawing.Color.Red;
                    resultado = false;
                }

            }

            if (resultado == true)
            {
                _vista.MensajeC.Visible = false;
                _vista.NombreEval.ForeColor = System.Drawing.Color.Black;
            }

            return resultado;
        }

        //Verifica que la suma de los porcentajes del esquema junto con el nuevo porcentaje otorgado a la evaluacion
        //no supere el 100%
        public bool VerificarPorcentajes(Evaluacion miEval, List<Evaluacion> misEvaluaciones)
        {
            int total = 0;
            bool resultado = true;

            foreach (Evaluacion _eval in misEvaluaciones)
            {
                if (miEval.IdEvaluacion != _eval.IdEvaluacion)
                total = total + _eval.Porcentaje;
            }

            total = total + miEval.Porcentaje;

            if (total > 100)
            {
                _vista.MensajeC.Text = "Operacion Fallida: No puede colocarle este porcentaje a la evaluacion, los porcentajes de las evaluaciones no pueden superar el 100%";
                _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                _vista.MensajeC.Visible = true;
                _vista.PorcentajeEval.ForeColor = System.Drawing.Color.Red;
                resultado = false;

            }

            if (resultado == true)
            {
                _vista.MensajeC.Visible = false;
                _vista.PorcentajeEval.ForeColor = System.Drawing.Color.Black;
            }

            return resultado;
        }

        //Realiza la llamada a los metodos para verificar la informacion del formulario
        public bool ValidarDatos()
        {
            if ((ValidarCampoNombreEvaluacion()) && (ValidarCampoPorcentajeEvaluacion()) && (ValidarCampoFecha()))
            {
                _vista.MensajeC.Visible = false;
                _evaluacionAModificar.Nombre = _vista.Nombre.Text;
                _evaluacionAModificar.Porcentaje = Convert.ToInt32(_vista.Porcentaje.Text);
                _evaluacionAModificar.TipoEvaluacion = _vista.Tipo.SelectedItem.Text;
                _evaluacionAModificar.FechaEvaluacion = Convert.ToDateTime(_vista.Fecha.Text);
                return true;

            }
            else
            {
                return false;
            }
        }

        //Valida los datos que se introducen en el campo porcentaje
        public bool ValidarCampoPorcentajeEvaluacion()
        {
            if (_vista.Porcentaje.Text.Length == 0)
            {
                _vista.MensajeC.Text = "Operacion Fallida: El campo Porcentaje es obligatorio";
                _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                _vista.PorcentajeEval.ForeColor = System.Drawing.Color.Red;
                _vista.MensajeC.Visible = true;
                _vista.Obligatorio3.Visible = true;

                return false;
            }
            else if (!ValidarSiEsNumero(_vista.Porcentaje.Text))
            {
                _vista.MensajeC.Text = "Operacion Fallida: El campo Porcentaje no puede tener letras";
                _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                _vista.MensajeC.Visible = true;
                _vista.PorcentajeEval.ForeColor = System.Drawing.Color.Red;
                return false;
            }
            else if (!ValidarMenorQueCien(_vista.Porcentaje.Text))
            {
                _vista.MensajeC.Text = "Operacion Fallida: El porcentaje de una evaluación no puede ser mayor a 100%";
                _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                _vista.MensajeC.Visible = true;
                _vista.PorcentajeEval.ForeColor = System.Drawing.Color.Red;
                return false;
            }
            else
            {
                 _vista.PorcentajeEval.ForeColor = System.Drawing.Color.Black;
                return true;
            }
        }

        //Valida que el valor del porcentaje de la evaluacion no sea mayor a 100%
        public bool ValidarMenorQueCien(string numero)
        {
            if (Convert.ToInt32(numero) <= 100)
                return true;
            else
                return false;
        }
        
        
        //Valida que el texto introducido en el campo porcentaje sea numerico
        public bool ValidarSiEsNumero(string numero)
        {
            try
            {
                Convert.ToInt32(numero);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        //Valida los datos que se introducen en el campo nombre 
        public bool ValidarCampoNombreEvaluacion()
        {
            if (_vista.Nombre.Text.Length == 0)
            {
                _vista.MensajeC.Text = "Operacion Fallida: El campo Nombre es obligatorio";
                _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                _vista.MensajeC.Visible = true;
                _vista.NombreEval.ForeColor = System.Drawing.Color.Red;
                _vista.Obligatorio1.Visible = true;
                return false;
            }
            else
            {
                _vista.NombreEval.ForeColor = System.Drawing.Color.Black;
                return true;
            }
        }

        //Valida los datos que se introducen en el campo fecha
        public bool ValidarCampoFecha()
        {
            if (_vista.Fecha.Text.Length == 0)
            {
                _vista.MensajeC.Text = "Operacion Fallida: El campo Fecha es obligatorio";
                _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                _vista.MensajeC.Visible = true;
                _vista.FechaEval.ForeColor = System.Drawing.Color.Red;
                _vista.Obligatorio4.Visible = true;
                return false;
            }
            else if (!ValidarSiEsFecha(_vista.Fecha.Text))
            {
                _vista.MensajeC.Text = "Operacion Fallida: La Fecha introducida tiene un formato invalido";
                _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                _vista.MensajeC.Visible = true;
                _vista.FechaEval.ForeColor = System.Drawing.Color.Red;
                return false;
            }
            else if (!ValidarSiEsFechaActual(_vista.Fecha.Text))
            {
                _vista.MensajeC.Text = "Operacion Fallida: La Fecha no puede ser anterior a la fecha actual";
                 _vista.MensajeC.ForeColor = System.Drawing.Color.Red;
                _vista.MensajeC.Visible = true;
                _vista.FechaEval.ForeColor = System.Drawing.Color.Red;
                return false;
             }
            else
            {
                _vista.FechaEval.ForeColor = System.Drawing.Color.Black;
                return true;
            }
        }

        //Valida los datos que se introducen en el campo fecha se introduzca solo fechas con formato valido
        public bool ValidarSiEsFecha(string fecha)
        {
            try
            {
                Convert.ToDateTime(fecha);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        //Valida que la fecha introducida sea mayor o igual a la fecha actual del sistema
        public bool ValidarSiEsFechaActual(string fecha)
        {
            if (Convert.ToDateTime(fecha) >= System.DateTime.Now)
                return true;
            else
                return false;

        }





        



    }
}